package com.king.juc.asynchronousmode;

import lombok.extern.slf4j.Slf4j;

import java.util.LinkedList;

/**
 * 消息队列类, java 线程之间通信
 * @author king
 * @date 2020/11/5 19:42
 */
@Slf4j(topic = "c.MessageQueue")
public class MessageQueue {
    /**
     * 消息的队列集合
     */
    private LinkedList<Message> list = new LinkedList<>();
    /**
     * 队列容量
     */
    private int capcity;

    public MessageQueue(int capcity) {
        this.capcity = capcity;
    }

    /**
     * 获取消息
     * @return
     */
    public Message take(){
        synchronized (list) {
            // 检查队列是否为空
            while(list.isEmpty()){
                try {
                    log.debug("队列为空, 消费者等待....");
                    list.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            Message message = list.removeFirst();
            log.debug("已消费: {}", message);
            list.notifyAll();
            // 返回第一条消息
            return message;
        }
    }

    /**
     * 存入消息
     */
    public void put(Message message){
        synchronized (list) {
            // 检查队列是否已满
            while (capcity == list.size()){
                try {
                    log.debug("队列已满, 生产者等待....");
                    list.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            // 将消息加入队列尾部
            list.addLast(message);
            log.debug("已生产: {}", message);
            list.notifyAll();
        }
    }
}
